#ifndef TEST_A_HPP   // make certain we only define the contents
#define TEST_A_HPP   // of this file once

#include <iostream>   // for std::cout, std::endl
#include <algorithm>  // for std::copy
#include <iterator>   // for std::ostream_iterator

using std::begin; using std::end; // C++11, for usage with plain array's

class a
{
    public:
        a(int b = 0, int c = 0) : b(b), c(c) { // initialization in order of declaration
        } 
        ~a() { // destructor
            std::cout << "Helas, I die when I go out of scope! "
                      << "(Except for dangling pointers.)" << std::endl;
        }
        void say_hello() const { // inline implementation of this function
            std::cout << "Hello from " << this << std::endl;
            std::cout << "b = " << b << ", c = " << c << std::endl;
            std::cout << "z = [ ";
            std::copy(begin(z), end(z), std::ostream_iterator<double>(std::cout, " "));
            std::cout << "]" << std::endl;
        }
        void print_sequence() const; // implementation in external file "a.cpp"
    private:
        int b; // initialization in initialization list of constructor
        int c; // ""
        static const size_t N = 10; // static can be initialized here
        static const double z[N];   // except if its an array -> a.cpp (changing in C++11)
}; // note the ";"

#endif
